home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 4 / CU Amiga Magazine's Super CD-ROM 04 (1996)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1996-11].iso / magazine / psion / utils / tree202.lzx / tree202.opl < prev   
Text File  |  1999-01-06  |  8KB  |  458 lines

  1. REM
  2. REM TREE for the Psion Series 3.
  3. REM Shows files and subdirs on disk.
  4. REM Based on the MS-DOS (yeuch) utility.
  5. REM Version 2.02 Dated 4 April 93
  6. REM A Chocolate Island Software program.
  7. REM Copyright (c) Rick Andrews 1992
  8. REM
  9. REM This program is freeware.
  10. REM Please send any comments etc. to:-
  11. REM Rick Andrews,
  12. REM 164 Castle Hill, Reading
  13. REM England   RG1 7RP
  14. REM
  15. REM Version history.
  16. REM V1.00 1 May 92 - Published in Ipso Facto.
  17. REM V2.00 1 Nov 92 - Made app.
  18. REM      - Print to file or printer.
  19. REM V2.00a 14 Nov 92 - Print to parallel printer.
  20. REM      - Increased capacity to 999 files.
  21. REM V2.01 26 Mar 93 - Tidy up for PD release.
  22. REM V2.02 4 April 93 - First release.
  23.  
  24.  
  25. APP Tree
  26.     ICON "\PIC\TREE.PIC"
  27.     TYPE 0
  28. ENDA
  29.  
  30.  
  31. PROC Tree:
  32. REM Global array of names and depth.
  33.     GLOBAL gaName$(999,12)
  34.     GLOBAL gaDepth%(999)
  35.  
  36. REM Max & actual number of entries.
  37.     GLOBAL GMAXENT%,gEntry%
  38.  
  39. REM Entry level used to calc depth.
  40.     GLOBAL gLevel%
  41.  
  42.     LOCAL disk$(4),disk%
  43.     LOCAL output%
  44.     LOCAL name$(9),f$(128),p%
  45.     LOCAL about%
  46.  
  47.     GMAXENT%=999
  48.     gEntry%=1
  49.     disk$="AMBC" 
  50.  
  51.     disk%=2 REM Internal 'M'.
  52.     output%=1 REM Screen.
  53.     about%=1 REM Don't show details.
  54.  
  55.     GIPRINT "A 'Chocolate Island Software' program"
  56.  
  57.     dINIT
  58.     dTEXT "","Tree",$302
  59.     dCHOICE disk%,"Drive","A,M,B,C"
  60.     dCHOICE output%,"Print to","Screen,File,Serial,Parallel"
  61.     dCHOICE about%,"About...","No,Yes"
  62.     IF DIALOG=0
  63.         RETURN
  64.     ENDIF
  65.  
  66.     IF about%=2
  67.         About:
  68.     ENDIF
  69.  
  70.     IF disk%=2 REM M
  71.         name$="RAMDRIVE"
  72.     ELSE
  73.         name$="(DRIVE-"+MID$(disk$,disk%,1)+")"
  74.     ENDIF
  75.  
  76.     IF output%=2
  77.         f$="\WRD\TREE.TXT"
  78.         dINIT "Tree details"
  79.         dEDIT name$,"Disk name"
  80.         dFILE f$,"Print to file",1 REM 16?
  81.         IF DIALOG=0
  82.             RETURN
  83.         ENDIF
  84.         IF EXIST (f$)
  85.             DELETE f$
  86.         ENDIF
  87.     ELSEIF output%=3 OR output%=4 REM Printers.
  88.         IF output%=3
  89.             p%=1 REM Serial.
  90.         ELSE
  91.             p%=2 REM Parallel.
  92.         ENDIF
  93.  
  94. REM Check the port is okay now, it can take
  95. REM quite a long time to scan a big disk...
  96.         IF chkprt:(p%)=0
  97.             RETURN REM no printer!
  98.         ENDIF
  99.         dINIT "Tree details"
  100.         dEDIT name$,"Disk name"
  101.         IF DIALOG=0
  102.             RETURN
  103.         ENDIF
  104.     ENDIF
  105.  
  106.     CLS
  107.     AT 8,4
  108.     PRINT "TREE listing of drive",MID$(disk$,disk%,1)
  109.     AT 12,6
  110.     PRINT "Examining "
  111.  
  112.     Descend:(MID$(disk$,disk%,1)+":")
  113.  
  114.     IF output%=1 REM Screen
  115.         CLS
  116.         ShowTree:(0) REM PRINT.
  117.     ELSE
  118.         AT 12,6
  119.         PRINT "Processing...      "
  120.         IF output%=2
  121.             LOPEN f$
  122.         ELSEIF output%=3 OR output%=4
  123. REM Having scanned the disk, re-open the
  124. REM connection to the printer...
  125.             IF p%=1
  126.                 LOPEN "TTY:A" REM open it for real.
  127.             ELSE
  128.                 LOPEN "PAR:A" REM Parallel.
  129.             ENDIF
  130.         ENDIF
  131.         LPRINT "Tree of disk '"+UPPER$(name$)+"'"
  132.         LPRINT "on",DATIM$
  133.         ShowTree:(1) REM LPRINT.
  134.         LPRINT
  135.     ENDIF
  136.  
  137.     IF output%>1
  138.         AT 12,6
  139.         PRINT "Done.        "
  140.         LCLOSE
  141.         IF output%=2 REM File
  142.             AT 8,8
  143.             PRINT "File is",f$
  144.         ENDIF
  145.     ENDIF
  146.     BUSY "Press any key",3 REM B right.
  147.     GET
  148.     BUSY OFF
  149. ENDP
  150.  
  151.  
  152. PROC Descend:(path$)
  153. REM Search filesystem.
  154.     LOCAL branch$(128),prev$(128)
  155.     LOCAL dummy$(128)
  156.     LOCAL dummyc%,curdep%
  157.  
  158.     gLevel%=gLevel%+1
  159.  
  160.     prev$=path$+"\"
  161.     branch$=DirChk$:(prev$)
  162.  
  163.     IF branch$="NotDir!"
  164.         AddEntry:(FileN$:(path$))
  165.         gLevel%=gLevel%-1
  166.         RETURN
  167.     ENDIF
  168.  
  169. REM Show user how hard we're working!
  170.     AT 22,6
  171.     PRINT DirN$:(path$)+"         "
  172.     AddEntry:(DirN$:(path$))
  173.  
  174.     curdep%=0
  175.     WHILE branch$<>""
  176. REM do children (recursive!)
  177.         Descend:(branch$)
  178.  
  179. REM Do peers, by restoring dir state.
  180.         dummy$=DIR$(prev$)
  181.         dummyc%=0
  182.         WHILE dummyc%<curdep%
  183.             dummy$=DIR$("")
  184.             dummyc%=dummyc%+1
  185.         ENDWH
  186.         curdep%=curdep%+1
  187.         branch$=DIR$("")
  188.     ENDWH
  189.     gLevel%=gLevel%-1
  190.     RETURN
  191. ENDP
  192.  
  193.  
  194. PROC FileN$:(p$)
  195. REM Get name of file.
  196.     LOCAL a$(128)
  197.     LOCAL off%(6)
  198.     a$=PARSE$(p$,"",off%())
  199.     RETURN RIGHT$(a$,LEN(p$)-off%(4)+1)
  200. ENDP
  201.  
  202.  
  203. PROC DirN$:(p$)
  204. REM Get name of directory.
  205.     LOCAL l%,c%
  206.     IF LOC(p$,"\")=0
  207.         RETURN p$+"\"
  208.     ENDIF
  209. REM Scan backwards for '\'
  210.     l%=LEN(p$)
  211.     DO
  212.         l%=l%-1
  213.         c%=c%+1
  214.     UNTIL MID$(p$,l%,1)="\"
  215.     RETURN RIGHT$(p$,c%)+"\"
  216. ENDP
  217.  
  218.  
  219. PROC DirChk$:(p$)
  220. REM Looking for directory.
  221.     LOCAL d$(128)
  222.     ONERR NoDir::
  223.     d$=DIR$(p$)
  224.     RETURN d$
  225. NoDir::
  226.     ONERR OFF
  227. REM -42 = "Directory does not exist".
  228.     IF ERR<>-42
  229.         ALERT(ERR$(ERR))
  230.         STOP
  231.     ENDIF
  232.     RETURN "NotDir!"
  233. ENDP
  234.  
  235.  
  236. PROC AddEntry:(name$)
  237. REM Store entry details.
  238.     IF gEntry%=GMAXENT%
  239.         GIPRINT "Too many entries - ignored"
  240.         gaName$(GMAXENT%)="somelost"
  241.     ELSE
  242.         gaDepth%(gEntry%)=gLevel%
  243.         gaName$(gEntry%)=name$
  244.         gEntry%=gEntry%+1
  245.     ENDIF
  246.     RETURN
  247. ENDP
  248.  
  249.  
  250. PROC ShowTree:(dev%)
  251. REM Display file system structure.
  252.     GLOBAL gTrunk%(20)
  253.  REM max depth 20 levels.
  254.  
  255.     LOCAL level%,file%,dir%
  256.     LOCAL pause%,index%
  257.  
  258.     gaDepth%(gEntry%)=0
  259.     IF dev%=0
  260.         PRINT gaName$(1)
  261.     ELSE
  262.         LPRINT gaName$(1)
  263.     ENDIF
  264.  
  265.     index%=2
  266.     DO
  267.         level%=gaDepth%(index%)
  268.         IF level%=0
  269.             BREAK
  270.         ENDIF
  271.  
  272.         IF GetPeer%:(index%)
  273.             gTrunk%(level%-1)=2 REM tee
  274.         ELSE
  275.             gTrunk%(level%-1)=1 REM bend
  276.         ENDIF
  277.  
  278.     IF dev%=0
  279.         PRINT GeTrunk$:(level%);
  280.         PRINT gaName$(index%)
  281.     ELSE
  282.         LPRINT GeTrunk$:(level%);
  283.         LPRINT gaName$(index%)
  284.     ENDIF
  285.  
  286. REM If not a directory...
  287.         IF RIGHT$(gaName$(index%),1)<>"\"
  288.             file%=file%+1
  289.         ELSE
  290.             dir%=dir%+1
  291.         ENDIF
  292.  
  293.         index%=index%+1
  294.         IF dev%=0
  295.             pause%=pause%+1
  296.             IF pause%=8
  297.                 BUSY CHR$(4),2
  298.                 pause%=0
  299.                 IF GET=27 REM 'Esc' to abandon.
  300.                     RETURN
  301.                 ENDIF
  302.                 BUSY OFF
  303.             ENDIF
  304.         ENDIF
  305.     UNTIL level%=0
  306.  
  307.     IF file%=1
  308.         IF dev%=0
  309.             PRINT "1 file",
  310.         ELSE
  311.             LPRINT "1 file",
  312.         ENDIF
  313.     ELSE
  314.         IF dev%=0
  315.             PRINT file%,"files",
  316.         ELSE
  317.             LPRINT file%,"files",
  318.         ENDIF
  319.     ENDIF
  320.     IF dir%=1
  321.         IF dev%=0
  322.             PRINT "in 1 directory."
  323.         ELSE
  324.             LPRINT "in 1 directory."
  325.         ENDIF
  326.     ELSE
  327.         IF dev%=0
  328.             PRINT "in",dir%,"directories."
  329.         ELSE
  330.             LPRINT "in",dir%,"directories."
  331.         ENDIF
  332.     ENDIF
  333.  
  334.     IF gaName$(GMAXENT%)<>""
  335.         IF dev%=0
  336.             PRINT "(Some entries lost, maximum is",GMAXENT%;")"
  337.         ELSE
  338.             LPRINT "(Some entries lost, maximum is",GMAXENT%;")"
  339.         ENDIF
  340.     ENDIF
  341.     RETURN
  342. ENDP
  343.  
  344.  
  345. PROC GeTrunk$:(depth%)
  346. REM Get trunk shape.
  347.     LOCAL i%,trunk$(40),b2%
  348.     LOCAL tee$(1),pipe$(1)
  349.     LOCAL bend$(1),dash$(1),spc$(1)
  350.  
  351.     pipe$=CHR$(179)
  352.     bend$=CHR$(192)
  353.     tee$=CHR$(195)
  354.     dash$=CHR$(196)
  355.  
  356.     spc$=CHR$(32) REM Space.
  357.  
  358.     IF depth%<=1
  359.         RETURN ""
  360.     ENDIF
  361.  
  362.     IF depth%=2
  363.         IF gTrunk%(1)=2
  364.             RETURN tee$+dash$
  365.         ELSE
  366.             RETURN bend$+dash$
  367.         ENDIF
  368.     ENDIF
  369.  
  370. REM depth is 3 or more.
  371.     b2%=depth%-2
  372.     trunk$=""
  373.     i%=1
  374.     DO
  375.         IF gTrunk%(i%)=2
  376.             trunk$=trunk$+pipe$+spc$
  377.         ELSE
  378.             trunk$=trunk$+spc$+spc$
  379.         ENDIF
  380.         i%=i%+1
  381.     UNTIL i%>b2%
  382.  
  383.     IF gTrunk%(depth%-1)=2
  384.         trunk$=trunk$+tee$+dash$
  385.     ELSE
  386.         trunk$=trunk$+bend$+dash$
  387.     ENDIF
  388.  
  389.     RETURN trunk$
  390. ENDP
  391.  
  392.  
  393. PROC GetPeer%:(index%)
  394. REM Any peers?
  395.     LOCAL curlev%,chklev%,i%
  396.     curlev%=gaDepth%(index%)
  397.     i%=index%+1
  398.     DO
  399.         chklev%=gaDepth%(i%)
  400.         IF chklev%=curlev%
  401.             RETURN -1
  402.         ENDIF
  403.         i%=i%+1
  404.     UNTIL chklev%<curlev%
  405.     RETURN 0
  406. ENDP
  407.  
  408. PROC ChkPrt:(type%)
  409. REM Check now to make sure printer
  410. REM is on and in.
  411. REM Returns 0 if Abandoned.
  412.     LOCAL okay%,d%
  413.  
  414.     okay%=0
  415.     DO
  416.         IF type%=1
  417.             TRAP LOPEN "TTY:A" REM Serial.
  418.         ELSE
  419.             TRAP LOPEN "PAR:A"
  420.         ENDIF
  421.         IF ERR
  422.             ALERT(ERR$(ERR),"More...")
  423.             dINIT "Printer link problems"
  424.             IF type%=1
  425.                 dTEXT "","Check serial printer",2
  426.             ELSE
  427.                 dTEXT "","Check parallel printer",2
  428.             ENDIF
  429.             dBUTTONS "Abandon",-27,"Retry",13
  430.             d%=DIALOG
  431.             IF d%=0 REM Esc.
  432.                 RETURN 0
  433.             ENDIF
  434.         ELSE
  435.             okay%=1
  436.         ENDIF
  437.     UNTIL okay%=1
  438.     LCLOSE REM Don't hog the printer port.
  439.     RETURN 1
  440. ENDP
  441.  
  442. PROC About:
  443.     dINIT
  444.     dTEXT "","Tree - a disk contents utility",$302
  445.     dTEXT "","A 'Chocolate Island Software' program",2
  446.     dTEXT "",CHR$(184)+" Rick Andrews 1992, 1993",2
  447.     dTEXT "","Version "+"2.02"+" - Dated 4 April 93",2
  448.     DIALOG
  449.     dINIT
  450.     dTEXT "","This program is freeware.",2
  451.     dTEXT "","If you have any comments about it, ",2
  452.     dTEXT "","please write to me:-",2
  453.     dTEXT "","Rick Andrews, 164 Castle Hill,",$102
  454.     dTEXT "","Reading, England  RG1 7RP",$102
  455.     dTEXT "","Share and Enjoy!",2
  456.     DIALOG
  457. ENDP
  458.